#ifndef _HELIX_GRAPHICS_RENDERER_HELPER_H_
#define _HELIX_GRAPHICS_RENDERER_HELPER_H_

#include "../Helix.h"
#include "../HObject.h"
#include "../Domain/HelixMesh.h"
//#include "HTriMesh.h"


namespace helix		//Put this in the helix namespace
{

	#define H_OPEN_GL_API 0
	#define H_DIRECT_X_API 1

	/**	Class with helper functions for rendering primitives and other objects.
	*	This class is abstract.  There is an implemented type for every Window type.
	*/
	class MY_CLASS RenderHelper : public HObject
	{
	protected:
		bool VSyncEnabled;
		int  APIType;
		bool CalcNorms;
		bool Available;


	public:

		/**	Default Constructor
		*	Implementations should set up any necesseray state.  A RenderHelper instance is maintained by
		*	the Window object, which is maintained by the Application singleton.  There should probably be
		*	an easier way to get to it, but for now, that's how you should access it.
		*/
		RenderHelper();

		/** Destructor
		*	Implementations should release any state that is maintained by the class.
		*/
		virtual ~RenderHelper(); 

		/** Set the vertical synchronization of the game loop with the hardware monitor.
		*	\param VSyncOn determines whether or not vertical sync is on or off.  A value of true
		*	will enable vsync, false will disable it.
		*	\return Whether or not the operation succeded.  The only reason it should not succede is 
		*	if the video card does not support the operation.
		*/
		virtual bool setVSync(bool VSyncOn)=0;          

		/** Set the size of a point to render
		*	This will set an internal state variable, so that every call to drawPoint3f after this call will
		*	be drawn at the size set with this method.
		*	\param size The size of the point to render in pixels (must be positive, can be fractions of a pixel).
		*/
		virtual void setPointSize(float size)=0;                       

		/**	Draws a point at the specified position
		*	\param vert An array of three floats, each index corresponding to the 3D position of the point.
		*	index 0 = position in X axis
		*	index 1 = position in Y axis
		*	index 2 = position in Z axis
		*/
		virtual void drawPoint3f(float vert[3])=0;

		/**	Draws the specified Mesh object, using as much vertex data as possible.
		*	Implementations of this method should try to use all vertex information that is available 
		*   in the Mesh.  At the very least, the raw faces should be drawn.  For example, if the Mesh
		*	has texture coordinate data, vertex color data, and a user specified data buffer, the mesh
		*	should at least be drawn with texture coordinates and vertex colors.
		*	\param mesh A pointer to the Mesh to draw.  
		*/
		virtual void drawMesh(Mesh *mesh)=0;

	};


}

#endif
